package landx.toolkit.db
{
	import flash.utils.Dictionary;
	/**
	 * 用来存储数据对象服务 
	 */	
	public class DataBase
	{
		private var m_db:Dictionary=new Dictionary();
		private var m_index:int=0;
		private var m_name:String="";
		public function DataBase(db_name:String="")
		{
			m_name=db_name;
		}
		
		/**
		 * 插入数据到数据库中 
		 * @param db
		 * @return 
		 */		
		public function addItem(db:DataBaseItem):int{
			m_index++;
			db.setid(m_index);
			db.setdb(this);
			m_db[m_index]=db;
			return m_index;
		}
		
		/**
		 * 更改指定项的索引 ，该操作方法会引用数据库中数据混乱
		 * @param dbt 数据子集
		 * @param index 数据索引
		 */		
		public function setItemIndex(dbt:DataBaseItem,index:int):void{
			if(dbt.db!=this){
				throw new Error("传入的参数不是该数据库的子项!");
			}
			
			if(index<=0){
				throw new Error("不能设置索引为0或负数!");
			}
			removeItem(dbt);
			dbt.setid(index);
			m_db[index]=dbt;
		}
		
		/**
		 *交换2个子数据的位置 
		 * @param child1	第一个子数据
		 * @param child2	第二个子数据
		 */		
		public function swap(child1:DataBaseItem,child2:DataBaseItem):void{
			if(child1==null || child2==null){
				throw new Error("传入的参数不能为null!");
				return;
			}
			if(child1.db!=this){
				throw new Error("传入的第一个参数不是该数据库的子项!");
				return;
			}
			if(child2.db!=this){
				throw new Error("传入的第二个参数不是该数据库的子项! ");
				return;
			}
			
			var index:int=child1.id;
			m_db[index]=child2;
			child2.setid(index);
			index=child2.id;
			m_db[index]=child1;
			child1.setid(index);
		}
		
		/**
		 *交换2个项的深度 
		 * @param index1	第一个索引
		 * @param index2	第二个索引
		 */		
		public function swapIndex(index1:int,index2:int):void{
			swap(getItem(index1),getItem(index2));
		}
		
		/**
		 *获得指定索引的项 
		 * @param index	索引
		 * @return 
		 */		
		public function getItem(index:int):DataBaseItem{
			return m_db[index];
		}
		
		/**
		 *从数据库中删除数据 
		 * @param index	索引
		 * @return 数据库项
		 */		
		public function remove(index:int):DataBaseItem{
			var dbt:DataBaseItem=m_db[index];
			if(dbt!=null){
				delete m_db[index];
			}
			return dbt;
		}
		
		/**
		 *从数据库中删除指定的数据 
		 * @param db 要删除的数据库子集
		 * @return 
		 */		
		public function removeItem(db:DataBaseItem):Boolean{
			if(!isnull(db.id)){
				delete m_db[db.id];
				return true;
			}
			return false;
		}
		
		/**
		 *判断数据是否存在 
		 * @param index
		 * @return 
		 */	
		private function isnull(index:int):Boolean{
			var mxd:DataBaseItem=m_db[index] as DataBaseItem;
			if(mxd==null){
				return true;
			}
			return false;
		}
		
		/**
		 *遍历数据库 
		 * @param callFunction 遍历的方法，必须带一个DataBaseItem参数,返回是否终止的信息,1则为正常进行，-1为终止
		 */		
		public function every(callFunction:Function):void{
			for each(var i:DataBaseItem in m_db){
				if(!callFunction.apply(null,[i])){
					break;
				}
			}
		}
		
		/**
		 * 数据库筛选 
		 * @param callFunction	返回1则正常处理，返回-1则放弃,返回0则停止执行并放弃当前操作，-2停止执行并保存当前操作
		 * @return DataBaseItem数组
		 */		
		public function filter(callFunction:Function):Array{
			var list:Array=new Array();
			for each(var i:DataBaseItem in m_db){
				var intx:int=callFunction.apply(null,m_db[i]);
				if(intx==0){
					break;
				}else if(intx==1){
					list.push(m_db[i]);
				}else  if(intx==-2){
					list.push(m_db);
					break;
				}
			}
			return list;
		}
		
		/**
		 *设置当前数据库的名字 
		 * @param db_name
		 */		
		public function set name(db_name:String):void{
			m_name=db_name;
		}
		
		public function get name():String{
			return m_name;
		}
		
		/**
		 * 获得当前的索引行 
		 * @return 
		 */		
		public function get index():int{
			return m_index;
		}
		
		/**
		 * 当前数据库的名字 
		 * @return 
		 */		
		public function toString():String{
			return "[db(name=\""+name+"\")]";
		}
	}
}